package com.zyf.chapter02.creation.prototype;

import java.util.HashMap;
import java.util.List;

/**
 * 替换数据为最新版本，目前仅仅存在增加和更新的需求
 * 需求：系统中的数据要么都是版本 a, 要么都是版本 b，不存在介于老版本与新版本之间的中间状态
 * 存在问题：构建成本过高，其实我们只需要新增或者更新的关键词数据就可以了
 * 解决方案： 拷贝 currentKeywords 数据到 newKeywords中，然后从数据库中只捞出新增或者有更新的关键词
 * v3 版存在问题：由于是浅拷贝，导致了 newkeywords 中存在版本 a 的数据，违反了第一个需求
 * @author yifeng
 */
public class V3Demo {
    private HashMap<String, SearchWord> currentKeywords = new HashMap<>();
    private long lastUpdateTime = -1;

    public void refresh() {
        // 浅拷贝一份，不影响正在使用的 map
        HashMap<String, SearchWord> newKeywords = (HashMap<String, SearchWord>) currentKeywords.clone();

        // 从数据中取出更新时间 > lastUpdateTime 的数据，放入到 currentKeyword 中
        List<SearchWord> toBeUpdatedSearchWords = getSearchWords(lastUpdateTime);
        long maxNewUpdatedTime = lastUpdateTime;
        for (SearchWord searchWord : toBeUpdatedSearchWords) {
            // 更新最新时间
            if (searchWord.getLastUpdateTime() > maxNewUpdatedTime) {
                maxNewUpdatedTime = searchWord.getLastUpdateTime();
            }
            // 存在则替换
            if (newKeywords.containsKey(searchWord.getKeyword())) {
                // 替换 使用该种替换方式导致 newKeywords中的数据存在版本 a 的数据（特指对象的引用）
                SearchWord oldSearchWord = newKeywords.get(searchWord.getKeyword());
                oldSearchWord.setCount(searchWord.getCount());
                oldSearchWord.setLastUpdateTime(searchWord.getLastUpdateTime());
                // 否则就插入
            } else {
                newKeywords.put(searchWord.getKeyword(), searchWord);
            }
        }
        lastUpdateTime = maxNewUpdatedTime;
        // 新版本创建好之后，在一次性地将服务版本替换为新版本
        currentKeywords = newKeywords;
    }

    /**
     * 从数据库中取出所有的数据
     * @return
     */
    private List<SearchWord> getSearchWords() {
        return null;
    }

    private List<SearchWord> getSearchWords(long lastUpdateTime) {
        // 从数据库中取出更新时间 > lastUpdateTime 的数据
        return null;
    }
}
